package cn.magic.controller;

import cn.magic.User;
import cn.magic.handler.UserBlockHandler;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RefreshScope  // 实时刷新远程配置
@RestController
public class UserController {
    @Value("${test}")
    private long test;

    /**
    *   1.sentinel有五种规则我们可以配置
    *   2.当触发了配置的规则 那么sentinel会抛出blockException
    *   3.当配置了blockHandler的时候 那么就会捕获blockException 并进入指定的方法
     *  4.当配置了fallback,那么程序出现异常 就会进入指定的方法
     *  5.如果fallback和blockHandler同时触发 那么会进到blockHandler指定的方法
    */
    @SentinelResource(value = "getUserById",blockHandler = "getUserByIdBlockHandler" ,
            blockHandlerClass = UserBlockHandler.class,
            fallback = "getUserByIdFallback")
    @GetMapping("/getById/{id}")
    public User getByUserId(@PathVariable Long id){
        int i = 1/0;
        return User.builder().id(test).name("刘亦菲").into("很润").build();
    }

    public static User getUserByIdFallback(@PathVariable Long id , Throwable e){
        return User.builder().id(-2l).name("系统或者报错这里").into("电脑发的").build();
    }
}
